package ar.edu.ufasta.presupuestos.logica.aplicativo;

import java.sql.ResultSet;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import ar.edu.ufasta.presupuestos.logica.entidades.Domicilio;
import ar.edu.ufasta.presupuestos.logica.entidades.Fabrica;
import ar.edu.ufasta.presupuestos.servicios.ConexionMySQL;
import ar.edu.ufasta.presupuestos.servicios.persistencia.ObjectID;
import ar.edu.ufasta.presupuestos.servicios.persistencia.PersistenceFacade;

public class ControladorSeccionFabricas extends ControladorGenerico {

	private Fabrica miFabrica;
	private Hashtable<String, Object> parametros;
	
	public Vector<Object[]> getRegistrosDonde(int tipo, String ordenLista, int condicion){
		Vector<Object[]> vec;
		vec = new Vector<Object[]>();
		switch (tipo) {
		case 1: // Fabricas
			vec = buscarFabricas(ordenLista, condicion);
			break;
		case 2: // Provincias
			vec = buscarProvincias(ordenLista,condicion);
			break;
		default:
			break;
		}
		return vec;
	}
	
	// TODO Llamada directa a BD porque no le veo sentido de hacer un mapper para esto
	private Vector<Object[]> buscarProvincias(String ordenLista, int condicion) {
		Vector<Object[]> vec;
		vec = new Vector<Object[]>();
		try {
			ConexionMySQL conn = ConexionMySQL.getInstancia();
			String zQuery = null;
			zQuery = "SELECT * FROM PROVINCIAS";
			ResultSet resul = conn.executeQuery(zQuery);
			while(resul.next()){
				Object[] record = new Object[2];
				record[0] = resul.getInt("ID");
				record[1] = resul.getString("nombre");
				vec.addElement(record);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return vec;
	}

	@SuppressWarnings("unchecked")
	private Vector<Object[]> buscarFabricas(String ordenLista, int condicion) {
		List<Fabrica> listado;
		Vector<Object[]> vec;
		vec = new Vector<Object[]>();
		
		listado = (List<Fabrica>) PersistenceFacade.getInstance().search(Fabrica.class, null);
		
		for (Iterator iterator = listado.iterator(); iterator.hasNext();) {
			Fabrica fabricaAct = (Fabrica) iterator.next();
			// Devuelvo arreglo de valores para la lista
			Object[] record = new Object[7];
			record[0] = fabricaAct.getIDValue();
			record[1] = fabricaAct.getNombre();
			record[2] = fabricaAct.getDomicilio().getDireccion();
			record[3] = fabricaAct.getTelefono();
			record[4] = fabricaAct.getEmail();
			record[5] = fabricaAct.getNombreContacto();
			record[6] = fabricaAct.getFechaEmision();
			vec.addElement(record);
		}
		return vec;
	}
	
	
	/**
	 * Encuentra una fabrica registrada en el sistema
	 * 
	 * @param code -> ID de la fabrica a traer de la base de datos
	 * @return void
	 * @throws Exception
	 * 
	 */
	public Hashtable<String, Object> consultaFabrica(String code)throws Exception{
		Hashtable<String, Object> fabricaMap = new Hashtable<String, Object>();
		try {
			miFabrica = (Fabrica)PersistenceFacade.getInstance().get(new ObjectID(Integer.valueOf(code)), Fabrica.class);
		
			fabricaMap.put("vFabricaID", miFabrica.getIDValue());
			fabricaMap.put("vNombre", miFabrica.getNombre());
			fabricaMap.put("vEmail", miFabrica.getEmail());
			fabricaMap.put("vSitioWeb", miFabrica.getSitioWeb());
			fabricaMap.put("vTelefono", miFabrica.getTelefono());
			fabricaMap.put("vContacto", miFabrica.getNombreContacto());
			fabricaMap.put("vDireccion", miFabrica.getDomicilio().getDireccion());
			fabricaMap.put("vCiudad", miFabrica.getDomicilio().getCiudad());
			fabricaMap.put("vCodigoPostal", miFabrica.getDomicilio().getCodigoPostal());
			fabricaMap.put("vProvincia", miFabrica.getDomicilio().getProvinciaCode());
			fabricaMap.put("vFechaCreacion", miFabrica.getFechaEmision());
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return fabricaMap;
	}
	
	
	/**
	 * Inserta una nueva fabrica en la base de datos
	 * 
	 * @param params ->
	 *            Parametros de la fabrica a insertar
	 * @return codigo de operacion
	 * @throws Exception
	 * 
	 */
	public int insertaFabrica(String nombrePK, Hashtable<String, Object> params, Vector<Object[]> items){
		Boolean resul_val=false;
		int ret;
		
		this.parametros = params;
		miFabrica = new Fabrica();
		Domicilio domicilio = new Domicilio();
		
		miFabrica.setNombre((String)parametros.get("vNombre"));
		miFabrica.setEmail((String)parametros.get("vEmail"));
		miFabrica.setSitioWeb((String)parametros.get("vSitioWeb"));
		miFabrica.setTelefono((String)parametros.get("vTelefono"));
		miFabrica.setNombreContacto((String)parametros.get("vContacto"));
		domicilio.setDireccion((String)parametros.get("vDireccion"));
		domicilio.setCiudad((String)parametros.get("vCiudad"));
		domicilio.setCodigoPostal((Integer)parametros.get("vCodigoPostal"));
		domicilio.setProvinciaCode((Integer)parametros.get("vProvincia"));
		miFabrica.setDomicilio(domicilio);
		miFabrica.setFechaEmision(new Date());
		
		resul_val = PersistenceFacade.getInstance().put(miFabrica);
		if (resul_val==true){
			ret = Constantes.OPERACION_OK.getValue();
		}else{
			ret = Constantes.ERROR_EN_CONSULTA_SQL.getValue();
		}
		return ret;
	}
	
	/**
	 * Elimina una fabrica en la base de datos
	 * 
	 * @param params -> Parametros del presupuesto a eliminar
	 * @return resultCode
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public int eliminaFabrica(Hashtable<String, Object> params){
		Boolean resul_val=false;
		int ret;
		this.parametros = params;
//		List<ArticuloSimple> listado;
//		List<ArticuloComplejo> listado2;
		Map<String, String> condicion=new Hashtable<String, String>();
		int ID = (Integer)parametros.get("vFabricaID");
		condicion.put("ID_Fabrica", String.valueOf(ID));
		
		
		
//		listado = (List<ArticuloSimple>)PersistenceFacade.getInstance().search(ArticuloSimple.class, condicion);
//		if (listado.size() != 0){
//			return Constantes.ERROR_TIENE_ARTICULOS_ASOCIADOS.getValue();
//		}
//		listado2 = (List<ArticuloComplejo>)PersistenceFacade.getInstance().search(ArticuloComplejo.class, condicion);
//		if (listado2.size() != 0){
//			return Constantes.ERROR_TIENE_ARTICULOS_ASOCIADOS.getValue();
//		}
		miFabrica = new Fabrica();
		miFabrica.setOid(new ObjectID((Integer)parametros.get("vFabricaID")));
		
		if(miFabrica.articulosAsociados()){
			return Constantes.ERROR_TIENE_ARTICULOS_ASOCIADOS.getValue();
		}
		
		resul_val = PersistenceFacade.getInstance().remove(miFabrica.getOid(), Fabrica.class);
		if (resul_val == true)
			ret = Constantes.OPERACION_OK.getValue();
		else
			ret = Constantes.ERROR_EN_CONSULTA_SQL.getValue();
		return ret;
	}
	
	
	/**
	 * Modifica un cliente de la base de datos
	 * @param params -> Parametros del cliente a modificar
	 * @return codigo de operacion
	 * @throws Exception
	 */
	public int modificaFabrica(Hashtable<String, Object> params, Vector<Object[]> items){
		Boolean resul_val=false;
		int ret;
		
		this.parametros = params;
		miFabrica = new Fabrica();
		Domicilio domicilio = new Domicilio();
		
		miFabrica.setOid(new ObjectID((Integer)parametros.get("vFabricaID")));
		miFabrica.setNombre((String)parametros.get("vNombre"));
		miFabrica.setEmail((String)parametros.get("vEmail"));
		miFabrica.setSitioWeb((String)parametros.get("vSitioWeb"));
		miFabrica.setTelefono((String)parametros.get("vTelefono"));
		miFabrica.setNombreContacto((String)parametros.get("vContacto"));
		domicilio.setDireccion((String)parametros.get("vDireccion"));
		domicilio.setCiudad((String)parametros.get("vCiudad"));
		domicilio.setCodigoPostal((Integer)parametros.get("vCodigoPostal"));
		domicilio.setProvinciaCode((Integer)parametros.get("vProvincia"));
		miFabrica.setDomicilio(domicilio);
		miFabrica.setFechaEmision((Date)parametros.get("vFechaCreacion"));
		
		resul_val = PersistenceFacade.getInstance().put(miFabrica);
		if (resul_val==true){
			ret = Constantes.OPERACION_OK.getValue();
		}else{
			ret = Constantes.ERROR_EN_CONSULTA_SQL.getValue();
		}
		return ret;
	}

}
